﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Common;
using System.Collections;
using System.Transactions;
using Caixa.DB;
using Caixa.Model;
using Caixa.Model.Enum;
using Caixa.Model.Interface;
using System.Data;

namespace Caixa.DAO
{
	public class DestinatarioTransacaoPessoaFisicaDAO : PessoaFisicaDAO
	{
		#region " Methods "

		#region " Get Methods "

		public new static DestinatarioTransacaoPessoaFisica GetByID(int id)
		{
			DestinatarioTransacaoPessoaFisica p = null;

			// Carrega os dados de PessoaFisica				
			PessoaFisica pessoaFisica = PessoaFisicaDAO.GetByID(id);
			if (pessoaFisica != null)
				p = DAHelper.ToModel<PessoaFisica, DestinatarioTransacaoPessoaFisica>(pessoaFisica);

			using (DAHelper db = new DAHelper())
			{
				string SQL = string.Format(@"
					SELECT 
						{1}, {2}, {3}, {4}, {5}
					FROM {0}					
					WHERE
						{2} = :{2}
				",
					DestinatarioTransacaoPessoaFisica.Fields.TABELA,
					DestinatarioTransacaoPessoaFisica.Fields.ID,
					DestinatarioTransacaoPessoaFisica.Fields.IDPESSOAFISICA,
					DestinatarioTransacaoPessoaFisica.Fields.IDBANCO,
					DestinatarioTransacaoPessoaFisica.Fields.NUMEROAGENCIA,
					DestinatarioTransacaoPessoaFisica.Fields.NUMEROCONTA
				);

				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(DestinatarioTransacaoPessoaFisica.Fields.IDPESSOAFISICA, id));

				// Executa a query no Conta de dados
				IEnumerator data = db.SelectSqlDr(SQL, parms.ToArray()).GetEnumerator();

				// Converte o resultado do banco de dados em objeto				
				p = DAHelper.ToModel<DestinatarioTransacaoPessoaFisica>(data, p);
			}

			return p;
		}

		public new static bool Existe(int id)
		{
			return (GetByID(id) != null);
		}

		public static List<DestinatarioTransacaoPessoaFisica> GetByConta(int contaID)
		{
			List<DestinatarioTransacaoPessoaFisica> list = new List<DestinatarioTransacaoPessoaFisica>();

			using (DAHelper db = new DAHelper())
			{
				string SQL = string.Format(@"
					SELECT 
						{1}
					FROM ContaFavorecido
					WHERE
						{0} = :{0}
				",
					Conta.Fields.ID,
					DestinatarioTransacaoPessoaFisica.Fields.ID
				);

				// Prepara os parâmetros da Query
				List<DbParameter> parms = new List<DbParameter>();
				parms.Add(db.GetParameter(Conta.Fields.ID, contaID));

				// Executa a query no Banco de dados				
				DataTable dt = db.SelectSqlDt(SQL, parms.ToArray());

				// Restaga a instâcia do objeto
				foreach (DataRow row in dt.Rows)
				{
					int destinatarioID;
					int.TryParse(string.Format("{0}", row[DestinatarioTransacaoPessoaFisica.Fields.ID]), out destinatarioID);
					DestinatarioTransacaoPessoaFisica d = GetByID(destinatarioID);
					if (d != null)
						list.Add(d);
				}
			}

			return list;
		}

		#endregion

		#region " Management Methods "



		#endregion

		#region " DDL Methods "

		public static int Insert(DestinatarioTransacaoPessoaFisica p)
		{
			int newID = 0;

			using (TransactionScope transaction = new TransactionScope())
			{
				// Insere a Pessoa				
				PessoaFisica pFilter = PessoaFisicaDAO.GetByCPF(p.CPF);
				if (pFilter == null)
					p.ID = PessoaFisicaDAO.Insert(p);
				else
					p = DAHelper.ToModel<PessoaFisica, DestinatarioTransacaoPessoaFisica>(pFilter, p);

				using (DAHelper db = new DAHelper())
				{
					// Prepara os parâmetros da Query
					List<DbParameter> parms = new List<DbParameter>();
					parms.Add(db.GetParameter(DestinatarioTransacaoPessoaFisica.Fields.ID, p.ID));
					parms.Add(db.GetParameter(DestinatarioTransacaoPessoaFisica.Fields.IDPESSOAFISICA, p.ID));
					parms.Add(db.GetParameter(DestinatarioTransacaoPessoaFisica.Fields.IDBANCO, p.IDBanco));
					parms.Add(db.GetParameter(DestinatarioTransacaoPessoaFisica.Fields.NUMEROAGENCIA, p.NumeroAgencia));
					parms.Add(db.GetParameter(DestinatarioTransacaoPessoaFisica.Fields.NUMEROCONTA, p.NumeroConta));

					// Executa a query no banco de dados e retorna o ID do novo registro
					db.InsertSql(DestinatarioTransacaoPessoaFisica.Fields.TABELA, parms.ToArray());
					newID = p.ID;
				}

				transaction.Complete();
			}

			return newID;
		}

		public static bool Update(DestinatarioTransacaoPessoaFisica p)
		{
			bool success = false;

			using (TransactionScope transaction = new TransactionScope())
			{
				using (DAHelper db = new DAHelper())
				{
					// Prepara os parâmetros da Query
					List<DbParameter> parms = new List<DbParameter>();
					parms.Add(db.GetParameter(DestinatarioTransacaoPessoaFisica.Fields.IDBANCO, p.IDBanco));
					parms.Add(db.GetParameter(DestinatarioTransacaoPessoaFisica.Fields.NUMEROAGENCIA, p.NumeroAgencia));
					parms.Add(db.GetParameter(DestinatarioTransacaoPessoaFisica.Fields.NUMEROCONTA, p.NumeroConta));

					// Define a cláusula where do Update
					string sWhere = string.Format("{0} = {1}", DestinatarioTransacaoPessoaFisica.Fields.ID, p.ID);

					// Executa a query no banco de dados e retorna se foi atualizado com sucesso
					success = db.UpdateSql(DestinatarioTransacaoPessoaFisica.Fields.TABELA, parms.ToArray(), sWhere);
				}

				// Atualiza a Pessoa
				if (success)
					success = PessoaFisicaDAO.Update(p);

				if (success)
					transaction.Complete();
			}

			return success;
		}

		public static bool Delete(DestinatarioTransacaoPessoaFisica p)
		{
			bool success = false;

			using (TransactionScope transaction = new TransactionScope())
			{
				using (DAHelper db = new DAHelper())
				{
					// Define a cláusula where do Delete
					string sWhere = string.Format("{0} = {1}", DestinatarioTransacaoPessoaFisica.Fields.ID, p.ID);

					// Executa a query no Conta de dados e retorna se o registro foi excluido com sucesso
					success = db.DeleteSql(DestinatarioTransacaoPessoaFisica.Fields.TABELA, sWhere);
				}

				// Exclui a Pessoa
				if (success)
					success = PessoaFisicaDAO.Delete(p);

				if (success)
					transaction.Complete();
			}

			return success;
		}

		#endregion

		#endregion
	}
}
